/***********************************************************
 *
 * Gaoth
 * Copyright (c) 2011- Marcus Lundgren
 *
 * This software is provided 'as-is', without any express or implied warranty.
 * In no event will the authors be held liable for any damages arising from
 * the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it freely,
 * subject to the following restrictions:
 *
 *  1. The origin of this software must not be misrepresented; you must not
 *     claim that you wrote the original software. If you use this software
 *     in a product, an acknowledgment in the product documentation would be
 *     appreciated but is not required.
 *
 *  2. Altered source versions must be plainly marked as such,
 *     and must not be misrepresented as being the original software.
 *
 *  3. This notice may not be removed or altered from any source distribution.
 *
 ***********************************************************/

#pragma once

#include <SFML/System.hpp>
#include <SFML/Network.hpp>

#include "../model/model.h"
#include <gaoth-shared/network/packet_manager.h>

class NetworkManager
{
public:
    /**
     * Constructor.
     *
     * @param model a reference to the game model.
     */
    NetworkManager( Model *model );
    /**
     * Destructor.
     */
    ~NetworkManager();
    /**
     * Connects to the server at the given address.
     *
     * @param address the address to the server.
     */
    void connect( const sf::IpAddress& address );
    /**
     * Send a packet with the given payload to the server.
     *
     * @param payload the payload to send to the server.
     */
    void send( const gth::shared::network::BasePayload& payload );
    /**
     * Check for updates from the server.
     */
    void update();

private:
    /**
     * The socket used to communicate to the server.
     */
    sf::TcpSocket _listener;
    /**
     *
     */
    sf::SocketSelector _selector;
    /**
     * A reference to the game model.
     */
    Model *_model;
    /**
     * Used to thread safe the network manager.
     */
    sf::Mutex _lock;
    /**
     * Used to create packages and extract payloads.
     */
    gth::shared::network::PacketManager _pkt_mgr;

    // Illegal
    NetworkManager();
    NetworkManager( const NetworkManager& );
    NetworkManager& operator=( const NetworkManager& );
};
